home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / netmail / rnr214.zip / LINEDRAW.PAS < prev    next >
Pascal/Delphi Source File  |  1996-02-02  |  5KB  |  263 lines

  1. unit linedraw;
  2.  
  3. {
  4. Russell_Schulz@locutus.ofB.ORG (960202)
  5.  
  6. Copyright 1996 Russell Schulz
  7.  
  8. this code is not in the Public Domain
  9.  
  10. permission is granted to use these routines in any application regardless
  11. of commercial status as long as the author of these routines assumes no
  12. liability for any damages whatsoever for any reason.  have fun.
  13. }
  14.  
  15. interface
  16.  
  17. uses dos,crt;
  18.  
  19. const
  20.   maxsavedbytes=4096;
  21.  
  22.   singletlchar=#218;
  23.   singletrchar=#191;
  24.   singleblchar=#192;
  25.   singlebrchar=#217;
  26.   singlehlinechar=#196;
  27.   singlevlinechar=#179;
  28.  
  29.   doubletlchar=#201;
  30.   doubletrchar=#187;
  31.   doubleblchar=#200;
  32.   doublebrchar=#188;
  33.   doublehlinechar=#205;
  34.   doublevlinechar=#186;
  35.  
  36. type
  37.   savedbytes=
  38.     record
  39.       buffer: array[1..maxsavedbytes] of char;
  40.       count: integer;
  41.       leftx: integer;
  42.       topy: integer;
  43.       rightx: integer;
  44.       bottomy: integer;
  45.     end;
  46.  
  47. procedure writexys(anx,any: integer; astr: string);
  48.  
  49. procedure singleline(leftx,topy,rightx,bottomy: integer);
  50. procedure singlebox(leftx,topy,rightx,bottomy: integer);
  51. procedure singleboxwh(leftx,topy,width,height: integer);
  52.  
  53. procedure doubleline(leftx,topy,rightx,bottomy: integer);
  54. procedure doublebox(leftx,topy,rightx,bottomy: integer);
  55. procedure doubleboxwh(leftx,topy,width,height: integer);
  56.  
  57. procedure emptybox(leftx,topy,rightx,bottomy: integer);
  58. procedure emptyboxwh(leftx,topy,width,height: integer);
  59.  
  60. procedure savearea(leftx,topy,rightx,bottomy: integer;
  61.  var saved: savedbytes);
  62. procedure saveareawh(leftx,topy,width,height: integer;
  63.  var saved: savedbytes);
  64.  
  65. {for restore, saved is var only for efficiency}
  66. procedure restorearea(var saved: savedbytes);
  67.  
  68. procedure staticpopup(anx,any: integer; astr: string);
  69. procedure removepopup;
  70.  
  71. implementation
  72.  
  73. var
  74.   staticpopupsavedbytes: savedbytes;
  75.  
  76. procedure writexys;
  77.  
  78. begin
  79.   gotoxy(anx,any);
  80.   write(astr);
  81. end;
  82.  
  83. procedure singleline;
  84.  
  85. var
  86.   onex,oney: integer;
  87.  
  88. begin
  89.   if leftx=rightx then
  90.     for oney := topy to bottomy do
  91.       writexys(leftx,oney,singlevlinechar)
  92.   else
  93.     for onex := leftx to rightx do
  94.       writexys(onex,topy,singlehlinechar)
  95. end;
  96.  
  97. procedure singlebox;
  98.  
  99. var
  100.   x,y: integer;
  101.  
  102. begin
  103.   singleline(leftx,topy,rightx,topy);
  104.   singleline(leftx,bottomy,rightx,bottomy);
  105.  
  106.   singleline(leftx,topy,leftx,bottomy);
  107.   singleline(rightx,topy,rightx,bottomy);
  108.  
  109.   writexys(leftx,topy,singletlchar);
  110.   writexys(rightx,topy,singletrchar);
  111.   writexys(leftx,bottomy,singleblchar);
  112.   writexys(rightx,bottomy,singlebrchar);
  113. end;
  114.  
  115. procedure singleboxwh;
  116.  
  117. begin
  118.   singlebox(leftx,topy,leftx+width-1,topy+height-1);
  119. end;
  120.  
  121. procedure doubleline;
  122.  
  123. var
  124.   onex,oney: integer;
  125.  
  126. begin
  127.   if leftx=rightx then
  128.     for oney := topy to bottomy do
  129.       writexys(leftx,oney,doublevlinechar)
  130.   else
  131.     for onex := leftx to rightx do
  132.       writexys(onex,topy,doublehlinechar)
  133. end;
  134.  
  135. procedure doublebox;
  136.  
  137. var
  138.   x,y: integer;
  139.  
  140. begin
  141.   doubleline(leftx,topy,rightx,topy);
  142.   doubleline(leftx,bottomy,rightx,bottomy);
  143.  
  144.   doubleline(leftx,topy,leftx,bottomy);
  145.   doubleline(rightx,topy,rightx,bottomy);
  146.  
  147.   writexys(leftx,topy,doubletlchar);
  148.   writexys(rightx,topy,doubletrchar);
  149.   writexys(leftx,bottomy,doubleblchar);
  150.   writexys(rightx,bottomy,doublebrchar);
  151. end;
  152.  
  153. procedure doubleboxwh;
  154.  
  155. begin
  156.   doublebox(leftx,topy,leftx+width-1,topy+height-1);
  157. end;
  158. procedure emptybox;
  159.  
  160. var
  161.   anx, any: integer;
  162.  
  163. begin
  164.   for any := topy+1 to bottomy-1 do
  165.     begin
  166.       gotoxy(leftx+1,any);
  167.       for anx := leftx+1 to rightx-1 do
  168.         write(' ');
  169.     end;
  170. end;
  171.  
  172. procedure emptyboxwh;
  173.  
  174. begin
  175.   emptybox(leftx,topy,leftx+width-1,topy+height-1);
  176. end;
  177.  
  178. procedure savearea;
  179.  
  180. var
  181.   anx,any: integer;
  182.   regs: registers;
  183.  
  184. begin
  185.   saved.leftx := leftx;
  186.   saved.topy := topy;
  187.   saved.rightx := rightx;
  188.   saved.bottomy := bottomy;
  189.  
  190.   saved.count := 0;
  191.  
  192.   for anx := leftx to rightx do
  193.     for any := topy to bottomy do
  194.       if saved.count<maxsavedbytes-1 then
  195.         begin
  196.           gotoxy(anx,any);
  197.  
  198. {read character+attribute from screen}
  199.           regs.ah := 8;
  200.           regs.bh := 0;
  201.           intr($10,regs);
  202.  
  203. {first character, then attribute}
  204.           inc(saved.count);
  205.           saved.buffer[saved.count] := chr(regs.al);
  206.           inc(saved.count);
  207.           saved.buffer[saved.count] := chr(regs.ah);
  208.         end;
  209. end;
  210.  
  211. procedure saveareawh;
  212.  
  213. begin
  214.   savearea(leftx,topy,leftx+width-1,topy+height-1,saved);
  215. end;
  216.  
  217. procedure restorearea;
  218.  
  219. var
  220.   anx,any: integer;
  221.   currbyte: integer;
  222.   regs: registers;
  223.  
  224. begin
  225.   currbyte := 0;
  226.  
  227.   for anx := saved.leftx to saved.rightx do
  228.     for any := saved.topy to saved.bottomy do
  229.       if currbyte<saved.count then
  230.         begin
  231.           gotoxy(anx,any);
  232.  
  233. {first character, then attribute}
  234.           inc(currbyte);
  235.           regs.al := ord(saved.buffer[currbyte]);
  236.           inc(currbyte);
  237.           regs.bl := ord(saved.buffer[currbyte]);
  238.  
  239. {write character+attribute to screen}
  240.           regs.ah := 9;
  241.           regs.bh := 0;
  242.           regs.cx := 1;
  243.           intr($10,regs);
  244.  
  245.         end;
  246. end;
  247.  
  248. procedure staticpopup;
  249.  
  250. begin
  251.   saveareawh(anx,any,length(astr)+2,3,staticpopupsavedbytes);
  252.   singleboxwh(anx,any,length(astr)+2,3);
  253.   writexys(anx+1,any+1,astr);
  254. end;
  255.  
  256. procedure removepopup;
  257.  
  258. begin
  259.   restorearea(staticpopupsavedbytes);
  260. end;
  261.  
  262. end.
  263.